package cn.uniquetech.util;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;

import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileUtil {
    private static String project_path = "d:\\amlss\\";

    public static void writeFile(String packageName, String fileName, String content) {
        String filePath = project_path;
        String subpath = packageName.replace('.', '/');
        String dir = filePath + subpath;
        String fn = dir + "/" + fileName;
        //System.out.println("dir:" + dir);
        try {
            File file = new File(dir);
            if (!file.exists()) {
                file.mkdirs();
            }
            file = new File(file, fileName);
            if (!file.exists()) {
                file.createNewFile();
            }
            FileWriter fw = new FileWriter(fn);
            PrintWriter pw = new PrintWriter(fw);
            pw.println(content);
            pw.flush();
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        String filePath = "E:\\soft\\YunDownload\\YunDownload\\下载目录\\视频\\慕课视频\\Java秒杀系统方案优化---高性能高并发实战\\";
        jyRar(filePath);
    }

    public static void jyRar(String filePath) {
        File file = new File(filePath);
        if (file.isDirectory()) {
            for (File nf : file.listFiles()) {
                if (nf.isDirectory()) {
                    String newFilePath = nf.getPath();
                    blFiles(newFilePath);
                } else {
                    //System.out.println("name 1:"+nf.getName());
                    jyFiles(nf, ".rar");
                }
            }
        } else {
            //System.out.println("namme:"+file.getName());
            jyFiles(file, ".rar");
        }
    }


    public static void unrar(File file, String dstDirectoryPath) throws Exception {

//        if (!srcRarPath.toLowerCase().endsWith(".rar")) {
//            System.out.println("非rar文件！");
//            return;
//        }
        File dstDiretory = new File(dstDirectoryPath);
        // 目标目录不存在时，创建该文件夹
        if (!dstDiretory.exists()) {
            dstDiretory.mkdirs();
        }
        File fol = null, out = null;
        Archive a = null;
        try {
            a = new Archive(file,null);
            if (a != null) {
                a.getMainHeader().print(); // 打印文件信息.
                FileHeader fh = a.nextFileHeader();
                while (fh != null) {
                    // 文件夹
                    if (fh.isDirectory()) {
                        // 如果是中文路径，调用getFileNameW()方法，否则调用getFileNameString()方法，还可以使用if(fh.isUnicode())
                        if (existZH(fh.getFileNameW())) {
                            fol = new File(dstDirectoryPath + File.separator + fh.getFileNameW());

                        } else {
                            fol = new File(dstDirectoryPath + File.separator + fh.getFileNameString());
                        }
                        fol.mkdirs();
                    } else { // 文件
                        if (existZH(fh.getFileNameW())) {
                            out = new File(dstDirectoryPath + File.separator + fh.getFileNameW().trim());
                        } else {
                            out = new File(dstDirectoryPath + File.separator + fh.getFileNameString().trim());
                        }
                        try {// 之所以这么写try，是因为万一这里面有了异常，不影响继续解压.
                            if (!out.exists()) {
                                // 相对路径可能多级，可能需要创建父目录.
                                if (!out.getParentFile().exists()) {
                                    out.getParentFile().mkdirs();
                                }
                                out.createNewFile();
                            }
                            FileOutputStream os = new FileOutputStream(out);
                            a.extractFile(fh, os);
                            os.close();
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                    fh = a.nextFileHeader();
                }
                a.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*

     * 判断是否是中文

     */

    public static boolean existZH(String str){
        String regEx = "[\\u4e00-\\u9fa5]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        while (m.find()) {
            return true;
        }
        return false;
    }


    public static void unzip(File zipFile, String dest, String passwd) throws ZipException {
        // 首先创建ZipFile指向磁盘上的.zip文件
        ZipFile zFile = new ZipFile(zipFile);
        // 设置文件名编码，在GBK系统中需要设置
        zFile.setFileNameCharset("GBK");
        // 验证.zip文件是否合法，包括文件是否存在、是否为zip文件、是否被损坏等
        if (!zFile.isValidZipFile()) {
            throw new ZipException("压缩文件不合法,可能被损坏.");
        }
        // 解压目录
        File destDir = new File(dest);
        if (destDir.isDirectory() && !destDir.exists()) {
            destDir.mkdir();
        }
        if (zFile.isEncrypted()) {
            // 设置密码
            zFile.setPassword(passwd.toCharArray());
        }
        // 将文件抽出到解压目录(解压)
        zFile.extractAll(dest);
    }

    private static void jyFiles(File file, String extName) {
        if (file.getName().lastIndexOf(extName) != -1) {
            // 首先创建ZipFile指向磁盘上的.zip文件
            try {
                // 将文件抽出到解压目录(解压)
                String newPath = file.getPath().substring(0, file.getPath().indexOf(".rar"));
                unrar(file, newPath);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void blFiles(String filePath) {
        File file = new File(filePath);
        if (file.isDirectory()) {
            for (File nf : file.listFiles()) {
                if (nf.isDirectory()) {
                    String newFilePath = nf.getPath();
                    System.out.println("new path:" + newFilePath);
                    System.out.println("new path file name:" + nf.getName());
                    blFiles(newFilePath);
                } else {
                    System.out.println("name 1:" + nf.getName());
                    clearFiles(nf, ".aria2");
                }
            }
        } else {
            System.out.println("namme:" + file.getName());
            clearFiles(file, ".aria2");
        }
    }

    private static void clearFiles(File file, String extName) {
        if (file.getName().lastIndexOf(extName) != -1) {
            file.delete();
        }
    }
}
